package com.yanggu.scala.chapater12.type2

//类型匹配
object MatchTypeDemo01 {

  def main(args: Array[String]): Unit = {
    //可以匹配对象的任意类型，这样做避免了使用isInstanceOf和asInstanceOf方法
    //1. Map[String, Int]和Map[Int, String]是两种不同的类型，其它类推。也就是说匹配时, 会进行泛型的数据类型的匹配
    //2. 在进行类型匹配时, 编译器会进行简单的检查, 看是否可能匹配上。如果匹配不上, 编译器会直接报错
    //3. case a: Int => a。这里是将obj的值赋给a。然后判断数据类型
    //4. 如果case _ 出现在match中间。表示隐藏变量名, 即不使用, 而不是表示默认匹配
    val a = 3
    val obj = if (a == 1) 1
    else if (a == 2) "2"
    else if (a == 3) BigInt(3)
    else if (a == 4) Map("aa" -> 1)
    else if (a == 5) Map(1 -> "aa")
    else if (a == 6) Array(1, 2, 3)
    else if (a == 7) Array("aa", 1)
    else if (a == 8) Array("aa")

    val result = obj match {
      //case _如果出现在中间, 则表示隐藏变量名, 即不使用而不是表示默认匹配
      case _: BigInt => println("BigInt类型")
      case a: Int => a
      case b: Map[String, Int] => "对象是Map[String, Int]"
      case _: Double => "Double数据类型"
      case c: Map[Int, String] => "对象是Map[Int, String]"
      case d: Array[Int] => "对象是Array[Int]"
      case f: BigInt => "对象是BigInt"
      case _ => "啥也不是"
    }
    println(result)

    val obj2 = 10
    obj2 match {
      case a: Int => println(a)
      //case b: Map[String, Int] => "Map[String, Int]"
    }
  }

}
